package com.yanceysong.snake.database;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @ClassName SnakeDataDatabaseUtil
 * @Description
 * @date 2024/7/2 下午6:04
 * @Author yanceysong
 * @Version 1.0
 */
public class SnakeDataDatabaseUtil {
    public static void insert(String username, int score) {
        Connection con = null;
        PreparedStatement psta = null;
        try {
            String insert_sql = "INSERT INTO record ( username ,score,insert_time)  VALUES (?,?,CURRENT_TIMESTAMP )";
            con = JdbcUtil.getConnection();
            if (con==null) throw new RuntimeException("数据库连接失败");
            /**
             使用prepareStatement而不是原来的Statement目的是解决sql注入问题。
             */
            con.setAutoCommit(false);//打开事务
            psta = con.prepareStatement(insert_sql);//用于执行静态SQL语句并返回其生成的结果的对象。
            psta.setString(1, username);//给sql第一个？赋值
            psta.setInt(2, score);//给sql第二个？赋值
            int res = psta.executeUpdate();
            /**
             *  在prepareStatement里面执行sql，先给sql的参数赋值（字符串里面的？）
             *    然后执行这条语句（注意这条语句没有参数）
             */
            /*
            如果执行成功，会返回影响的行数。
            为0则数据库没有进行任何变化。
             */
            if (res > 0) {
                System.out.println("添加成功！");
            } else {
                System.out.println("添加失败！");
            }
            con.commit();//如果没有异常的发生，证明操作正常，则提交事务，改变数据库的值
        } catch (Exception throwables) {
            if (con != null) {
                try {
                    con.rollback();
                    /**
                     * 如果发生了异常，则需要把事务回滚，防止数据库意外发生
                     * 需要注意的是，在catch里面，要选择Exception，只要出现了异常就要进行回滚操作
                     */
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            throwables.printStackTrace();
        } finally {
            JdbcUtil.close(psta, con);//释放资源
        }
    }

    public static void select() {
        ResultSet result = null;
        Connection con = null;
        PreparedStatement psta = null;
        try {
            String select_sql = "SELECT * FROM record";
            con = JdbcUtil.getConnection();
            psta = con.prepareStatement(select_sql);//用于执行静态SQL语句并返回其生成的结果的对象。
            result = psta.executeQuery();
            while (result.next()) {
                System.out.println(result.getString(1) + "     " + result.getInt(2) + "     " + result.getString(3));
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            JdbcUtil.close(result, psta, con);
        }
    }
}
